C++ প্রোগ্রামিং ভাষায় অ্যাডভান্সড টপিকস কয়েকটি গুরুত্বপূর্ণ ধারণা নিয়ে গঠিত, যা অভিজ্ঞ প্রোগ্রামারদের জন্য প্রয়োজনীয় এবং জটিল প্রোগ্রাম তৈরি করতে সহায়ক। নিচে C++ এর কয়েকটি গুরুত্বপূর্ণ অ্যাডভান্সড টপিকস নিয়ে আলোচনা করা হলো:
টেমপ্লেট হলো এমন একটি বৈশিষ্ট্য, যার মাধ্যমে আমরা জেনেরিক ফাংশন ও ক্লাস তৈরি করতে পারি। এটি কোডের পুনঃব্যবহারযোগ্যতা এবং নমনীয়তা বৃদ্ধি করে। টেমপ্লেট ফাংশন বা ক্লাস একই ধরনের লজিক দিয়ে বিভিন্ন ডেটা টাইপের সাথে কাজ করতে পারে।
#include <iostream>
using namespace std;
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
cout << "Integer addition: " << add(5, 10) << endl;
cout << "Float addition: " << add(5.5, 10.3) << endl;
return 0;
}
একাধিক ইনহেরিটেন্স হলো একটি ক্লাস একাধিক বেজ ক্লাস থেকে উত্তরাধিকারী হতে পারে। এটি এমন পরিস্থিতিতে সহায়ক যখন একটি ক্লাস একাধিক বৈশিষ্ট্য সংগ্রহ করতে চায়। তবে এটি ডায়মন্ড প্রবলেম সৃষ্টি করতে পারে, যা ভার্চুয়াল ইনহেরিটেন্সের মাধ্যমে সমাধান করা হয়।
#include <iostream>
using namespace std;
class A {
public:
void display() {
cout << "Class A" << endl;
}
};
class B {
public:
void display() {
cout << "Class B" << endl;
}
};
class C : public A, public B {
};
int main() {
C obj;
obj.A::display(); // Class A এর display কল করা
obj.B::display(); // Class B এর display কল করা
return 0;
}
C++11 থেকে স্মার্ট পয়েন্টার যোগ করা হয়েছে, যা ডায়নামিক মেমোরি ম্যানেজমেন্ট আরও কার্যকর করে। এটি স্বয়ংক্রিয়ভাবে মেমোরি মুক্ত করে, যা ম্যানুয়াল delete
এর প্রয়োজনীয়তা দূর করে।
#include <iostream>
#include <memory>
using namespace std;
int main() {
unique_ptr<int> ptr1 = make_unique<int>(25);
cout << "Value: " << *ptr1 << endl;
shared_ptr<int> ptr2 = make_shared<int>(50);
cout << "Shared Value: " << *ptr2 << endl;
return 0;
}
STL হলো একটি শক্তিশালী লাইব্রেরি, যা বিভিন্ন ডেটা স্ট্রাকচার (কনটেইনার), অ্যালগরিদম এবং ইটারেটর নিয়ে গঠিত। এটি প্রোগ্রামিংয়ের সময় বিভিন্ন জটিল কাজকে সহজ করে।
vector
, list
, set
, map
ইত্যাদি।sort
, find
, binary_search
ইত্যাদি।#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> numbers = {10, 20, 30, 40};
// সন্নিবেশ করা
numbers.push_back(50);
// সাজানো
sort(numbers.begin(), numbers.end());
for (int num : numbers) {
cout << num << " ";
}
return 0;
}
মাল্টিথ্রেডিং C++11 এ <thread>
লাইব্রেরির মাধ্যমে সহজ করা হয়েছে। এটি একাধিক কাজ সমান্তরালে (parallel) সম্পন্ন করতে সহায়ক। মাল্টিথ্রেডিং ব্যবহার করে প্রোগ্রামের পারফরম্যান্স বৃদ্ধি করা যায়।
#include <iostream>
#include <thread>
using namespace std;
void task1() {
for (int i = 1; i <= 5; i++) {
cout << "Task 1 - " << i << endl;
}
}
void task2() {
for (int i = 1; i <= 5; i++) {
cout << "Task 2 - " << i << endl;
}
}
int main() {
thread t1(task1);
thread t2(task2);
t1.join();
t2.join();
return 0;
}
অপারেটর ওভারলোডিংয়ের মাধ্যমে সাধারণ অপারেটরগুলো ইউজার-ডিফাইন্ড ডেটা টাইপের জন্য কাস্টম ব্যাবহার তৈরি করা যায়। এটি একটি ক্লাসের অবজেক্টের উপর সাধারণ অপারেটর প্রয়োগ করতে দেয়।
+
অপারেটর ওভারলোড#include <iostream>
using namespace std;
class Complex {
private:
float real, imag;
public:
Complex(float r = 0, float i = 0) : real(r), imag(i) {}
Complex operator + (const Complex &c) {
return Complex(real + c.real, imag + c.imag);
}
void display() {
cout << real << " + " << imag << "i" << endl;
}
};
int main() {
Complex c1(3.5, 2.5), c2(1.5, 3.0), c3;
c3 = c1 + c2;
c3.display();
return 0;
}
ফাইল হ্যান্ডলিংয়ের মাধ্যমে প্রোগ্রামে ডেটা সংরক্ষণ এবং পড়া সম্ভব। C++ এ ifstream
, ofstream
, এবং fstream
ব্যবহার করে ফাইল থেকে ডেটা পড়া ও লেখা যায়।
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream outFile("example.txt");
outFile << "Hello, File!" << endl;
outFile.close();
ifstream inFile("example.txt");
string content;
while (getline(inFile, content)) {
cout << content << endl;
}
inFile.close();
return 0;
}
C++ এ এক্সেপশন হ্যান্ডলিং ব্যবহৃত হয় অপ্রত্যাশিত ত্রুটি মোকাবেলায়। try
, catch
, এবং throw
ব্যবহার করে এক্সেপশন হ্যান্ডলিং করা হয়।
#include <iostream>
using namespace std;
int main() {
try {
int x = 10, y = 0;
if (y == 0) {
throw "Division by zero error!";
}
cout << "Result: " << x / y << endl;
} catch (const char* e) {
cout << "Exception: " << e << endl;
}
return 0;
}
C++11 থেকে ল্যাম্বডা এক্সপ্রেশন যুক্ত হয়েছে, যা ইনলাইন অ্যানোনিমাস ফাংশন তৈরি করতে ব্যবহৃত হয়। এটি সাধারণত ছোট ফাংশন বা কলব্যাক ফাংশন হিসেবে ব্যবহৃত হয়।
#include <iostream>
using namespace std;
int main() {
auto add = [](int a, int b) -> int {
return a + b;
};
cout << "Sum: " << add(5, 3) << endl;
return 0;
}
টপিক | বর্ণনা |
---|---|
টেমপ্লেট | জেনেরিক ফাংশন ও ক্লাস তৈরি করার জন্য ব্যবহৃত |
একাধিক ইনহেরিটেন্স | একাধিক বেজ ক্লাস থেকে ডেরাইভ করা |
স্মার্ট পয়েন্টার | ডায়নামিক মেমোরি ম্যানেজমেন্টে কার্যকর |
STL | ডেটা স্ট্রাকচার, অ্যালগরিদম এবং ইটারেটর |
মাল্টিথ্রেডিং | একাধিক কাজ সমান্তরালে সম্পন্ন করার প্রক্রিয়া |
অপারেটর ওভারলোডিং | ইউজার-ডিফাইন্ড ডেটা টাইপের জন্য অপারেটর কাস্টমাইজেশন |
ফাইল হ্যান্ডলিং | ফাইল থেকে ডেটা পড়া ও লেখা |
এক্সেপশন হ্যান্ডলিং | ত্রুটি মোকাবেলা |
ল্যাম্বডা এক্সপ্রেশন | ইনলাইন অ্যানোনিমাস ফাংশন |
C++ এর এই অ্যাডভান্সড টপিকসগুলো একজন প্রোগ্রামারকে দক্ষভাবে জটিল প্রোগ্রাম তৈরি এবং পরিচালনা করতে সহায়তা করে।
মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর C++11 থেকে চালু করা হয়, যা ডাটা মেম্বারগুলোর রিসোর্স বা মেমোরি স্থানান্তর করতে সহায়ক। এটি মূলত রিসোর্স ইনটেনসিভ অবজেক্ট (যেমন, বড় অ্যারে বা ডাইনামিক মেমোরি) ব্যবহারের ক্ষেত্রে কাজকে দ্রুততর করে। সাধারণত, মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর এমন ক্লাসের জন্য প্রয়োজন হয়, যা ডাইনামিক মেমোরি ব্যবহারের মাধ্যমে কাজ করে।
C++ এ সাধারণত অবজেক্ট কপি করার সময় কপি কনস্ট্রাক্টর এবং কপি অ্যাসাইনমেন্ট অপারেটর ব্যবহৃত হয়। কিন্তু কপি করার ক্ষেত্রে সম্পূর্ণ ডেটা কপি করতে হয়, যা সময়সাপেক্ষ এবং মেমোরি ইনটেনসিভ হতে পারে। মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর এই সমস্যার সমাধান করে, কারণ তারা কপি না করে ডেটার মালিকানা (ownership) স্থানান্তর করে।
মুভ কনস্ট্রাক্টর ব্যবহার করে একটি অবজেক্ট তৈরি করা হলে, এটি মূল অবজেক্টের ডেটার মালিকানা নিয়ে নেয় এবং মূল অবজেক্টটিকে null বা nullptr
করে দেয়। ফলে ডেটা স্থানান্তর সহজ এবং দ্রুত হয়।
ClassName(ClassName&& other);
ClassName&&
হলো রাইট ভ্যালু রেফারেন্স (rvalue reference
), যা মুভ অপারেশন সমর্থন করে।#include <iostream>
#include <utility> // std::move এর জন্য
using namespace std;
class MyClass {
int* data;
public:
// কনস্ট্রাক্টর
MyClass(int value) {
data = new int(value);
cout << "Constructor called!" << endl;
}
// মুভ কনস্ট্রাক্টর
MyClass(MyClass&& other) noexcept : data(other.data) {
other.data = nullptr; // মূল অবজেক্টটিকে null করে দেওয়া
cout << "Move Constructor called!" << endl;
}
// ডেস্ট্রাক্টর
~MyClass() {
delete data;
cout << "Destructor called!" << endl;
}
int getValue() const {
return *data;
}
};
int main() {
MyClass obj1(42); // সাধারণ কনস্ট্রাক্টর কল
MyClass obj2 = std::move(obj1); // মুভ কনস্ট্রাক্টর কল
cout << "Value of obj2: " << obj2.getValue() << endl; // Output: Value of obj2: 42
return 0;
}
বর্ণনা:
MyClass(MyClass&& other)
হলো মুভ কনস্ট্রাক্টর, যা obj1
থেকে obj2
তে ডেটার মালিকানা সরিয়ে নেয়।std::move(obj1)
ব্যবহার করে obj1
থেকে মালিকানা obj2
তে স্থানান্তর করা হয়েছে।obj1
এর data
পয়েন্টার nullptr
হয়ে যায় এবং অবশেষে যখন obj1
ডেস্ট্রয় হয়, তখন ডেটা ডিলিট হবে না, কারণ এর মালিকানা ইতিমধ্যে obj2
এর কাছে চলে গেছে।মুভ অ্যাসাইনমেন্ট অপারেটর মুভ কনস্ট্রাক্টরের মতোই কাজ করে, তবে এটি ইতোমধ্যে বিদ্যমান অবজেক্টকে অন্য অবজেক্টের মালিকানা প্রদান করে।
ClassName& operator=(ClassName&& other);
#include <iostream>
#include <utility>
using namespace std;
class MyClass {
int* data;
public:
// কনস্ট্রাক্টর
MyClass(int value) {
data = new int(value);
cout << "Constructor called!" << endl;
}
// মুভ কনস্ট্রাক্টর
MyClass(MyClass&& other) noexcept : data(other.data) {
other.data = nullptr;
cout << "Move Constructor called!" << endl;
}
// মুভ অ্যাসাইনমেন্ট অপারেটর
MyClass& operator=(MyClass&& other) noexcept {
if (this != &other) { // সেলফ-অ্যাসাইনমেন্ট চেক
delete data; // পুরানো ডেটা মুক্ত করা
data = other.data;
other.data = nullptr;
cout << "Move Assignment called!" << endl;
}
return *this;
}
// ডেস্ট্রাক্টর
~MyClass() {
delete data;
cout << "Destructor called!" << endl;
}
int getValue() const {
return *data;
}
};
int main() {
MyClass obj1(42);
MyClass obj2(100);
obj2 = std::move(obj1); // মুভ অ্যাসাইনমেন্ট অপারেটর কল
cout << "Value of obj2: " << obj2.getValue() << endl; // Output: Value of obj2: 42
return 0;
}
বর্ণনা:
operator=(MyClass&& other)
মুভ অ্যাসাইনমেন্ট অপারেটর, যা obj1
থেকে obj2
এ ডেটার মালিকানা স্থানান্তর করে।delete data;
দিয়ে পূর্ববর্তী ডেটা ডিলিট করে নতুন মালিকানা obj1
থেকে স্থানান্তর করা হয়েছে।দ্রুত কার্য সম্পাদন: ডেটা কপি না করে সরাসরি মালিকানা স্থানান্তরের মাধ্যমে অপারেশন দ্রুত সম্পন্ন হয়।
মেমোরি সাশ্রয়: কপি করার চেয়ে মালিকানা স্থানান্তর কম মেমোরি ব্যবহার করে, বিশেষত বড় অবজেক্টের ক্ষেত্রে।
রিসোর্স ম্যানেজমেন্ট উন্নত করা: মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর রিসোর্স ইনটেনসিভ অবজেক্ট ম্যানেজমেন্টে কার্যকর ভূমিকা রাখে।
রাইট ভ্যালু রেফারেন্স: মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটরে রাইট ভ্যালু রেফারেন্স (&&
) ব্যবহার করতে হবে।
null বা nullptr: মুভের পরে, মূল অবজেক্টের ডেটা পয়েন্টার nullptr
এ সেট করা উচিত, যেন ডাবল ডিলিট এড়ানো যায়।
সেলফ-অ্যাসাইনমেন্ট চেক: মুভ অ্যাসাইনমেন্ট অপারেটরের ক্ষেত্রে সেলফ-অ্যাসাইনমেন্ট চেক করা গুরুত্বপূর্ণ, যাতে একই অবজেক্টে মুভ করে ডেটা ডিলিট না হয়ে যায়।
মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর রিসোর্স ইনটেনসিভ কাজগুলোর জন্য অত্যন্ত কার্যকর, কারণ এটি প্রোগ্রামকে আরও কার্যকর ও দ্রুততর করে তোলে।
ল্যাম্বডা এক্সপ্রেশন C++11 এ যুক্ত হওয়া একটি বৈশিষ্ট্য, যা ইনলাইন বা অ্যানোনিমাস ফাংশন তৈরি করতে ব্যবহৃত হয়। এটি বিশেষ করে ছোট ছোট ফাংশন বা কলব্যাক ফাংশন হিসেবে ব্যবহৃত হয়, যেখানে ফাংশনের নাম না দিয়ে সরাসরি ফাংশন ডিফাইন করা যায়। ল্যাম্বডা এক্সপ্রেশন কোডকে আরও সংক্ষিপ্ত এবং কার্যকর করে তোলে।
[capture_list] (parameters) -> return_type {
// function body
};
#include <iostream>
using namespace std;
int main() {
auto add = [](int a, int b) -> int {
return a + b;
};
cout << "Sum: " << add(5, 3) << endl;
return 0;
}
বর্ণনা:
add
নামে একটি ল্যাম্বডা এক্সপ্রেশন তৈরি করা হয়েছে, যা দুইটি int
প্যারামিটার গ্রহণ করে এবং তাদের যোগফল রিটার্ন করে।add(5, 3)
কল করলে ৫ এবং ৩ এর যোগফল প্রদান করবে।আউটপুট:
Sum: 8
ক্যাপচার লিস্টের মাধ্যমে ল্যাম্বডা এক্সপ্রেশন বাইরের ভ্যারিয়েবল অ্যাক্সেস করতে পারে। এর মাধ্যমে বিভিন্নভাবে বাইরের ভ্যারিয়েবল ব্যবহার করা যায়।
#include <iostream>
using namespace std;
int main() {
int x = 5;
int y = 10;
auto add = [x, &y]() {
// x কপি করা হয়েছে এবং y রেফারেন্স করা হয়েছে
cout << "Inside Lambda - x: " << x << ", y: " << y << endl;
y += 10;
};
add();
cout << "Outside Lambda - x: " << x << ", y: " << y << endl;
return 0;
}
বর্ণনা:
x
কে কপি করা হয়েছে এবং y
কে রেফারেন্স করে ব্যবহার করা হয়েছে।y
এর মান পরিবর্তন করতে পারে কারণ এটি রেফারেন্স হিসেবে পাস করা হয়েছে।আউটপুট:
Inside Lambda - x: 5, y: 10
Outside Lambda - x: 5, y: 20
ল্যাম্বডা এক্সপ্রেশন সাধারণত STL অ্যালগরিদম, যেমন std::for_each
, std::find_if
, std::sort
ইত্যাদির সাথে সহজে ব্যবহার করা যায়।
std::for_each
এর সাথে ল্যাম্বডা এক্সপ্রেশন#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> numbers = {1, 2, 3, 4, 5};
// ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে প্রতিটি মান প্রিন্ট করা
for_each(numbers.begin(), numbers.end(), [](int n) {
cout << n << " ";
});
cout << endl;
return 0;
}
আউটপুট:
1 2 3 4 5
#include <iostream>
using namespace std;
int main() {
auto multiply = [](int a, int b) {
return a * b;
};
cout << "Multiplication: " << multiply(4, 5) << endl;
return 0;
}
আউটপুট:
Multiplication: 20
for_each
, find_if
, sort
ইত্যাদি অ্যালগরিদমে সহজেই ছোট ছোট লজিক যোগ করা যায়।উপাদান | বর্ণনা |
---|---|
[capture_list] | বাইরের ভ্যারিয়েবল কীভাবে ব্যবহার হবে তা উল্লেখ করে |
(parameters) | ল্যাম্বডা এক্সপ্রেশনের ইনপুট প্যারামিটার |
-> return_type | রিটার্ন টাইপ উল্লেখ করতে ব্যবহৃত, তবে অনেক ক্ষেত্রেই এটি অপ্রয়োজনীয় |
function body | ফাংশনের কার্যাবলী উল্লেখ করা হয় |
ল্যাম্বডা এক্সপ্রেশন C++ প্রোগ্রামিংয়ে কোড সংক্ষিপ্ত এবং সহজ করে তোলে, বিশেষ করে ছোট ফাংশন বা কোলব্যাক হিসেবে এর ব্যবহার খুবই কার্যকর। C++11 এর এই বৈশিষ্ট্য প্রোগ্রামারদের জটিল কাজ সহজভাবে করতে সাহায্য করে।
কনকারেন্সি (Concurrency) এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং (Asynchronous Programming) C++11 এবং পরবর্তী সংস্করণে প্রবর্তিত এমন দুটি ধারণা, যা প্রোগ্রামকে কার্যকরভাবে সমান্তরাল (parallel) এবং অ্যাসিঙ্ক্রোনাসভাবে কাজ করতে সহায়ক করে।
কনকারেন্সি হলো এমন একটি প্রক্রিয়া, যেখানে একই সময়ে একাধিক কাজ চালানোর মাধ্যমে প্রোগ্রামের কার্যকারিতা বাড়ানো যায়। C++ এ কনকারেন্সির জন্য থ্রেড (thread) ব্যবহৃত হয়। কনকারেন্ট প্রোগ্রামিংয়ের মাধ্যমে একই সময়ে একাধিক থ্রেডের মাধ্যমে কাজ করা যায়।
#include <iostream>
#include <thread>
using namespace std;
void task1() {
for (int i = 0; i < 5; i++) {
cout << "Task 1 - iteration " << i << endl;
}
}
void task2() {
for (int i = 0; i < 5; i++) {
cout << "Task 2 - iteration " << i << endl;
}
}
int main() {
thread t1(task1); // থ্রেড t1 তৈরি করা যা task1 চালাবে
thread t2(task2); // থ্রেড t2 তৈরি করা যা task2 চালাবে
t1.join(); // মূল থ্রেড t1 শেষ হওয়ার জন্য অপেক্ষা করবে
t2.join(); // মূল থ্রেড t2 শেষ হওয়ার জন্য অপেক্ষা করবে
return 0;
}
বর্ণনা:
task1
এবং task2
নামে দুটি ফাংশন তৈরি করা হয়েছে, যেগুলো আলাদা আলাদা থ্রেডে চালানো হয়েছে।t1.join()
এবং t2.join()
দ্বারা মূল থ্রেড অপেক্ষা করে যে t1
এবং t2
থ্রেড শেষ হয়ে যাবে।অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং হলো এমন একটি প্রক্রিয়া, যেখানে একটি কাজ চলতে চলতেই অন্য কাজ শুরু করা যায় এবং কাজের ফলাফল প্রাপ্তির জন্য অপেক্ষা না করেই অন্যান্য কাজ চালানো সম্ভব হয়। C++11 থেকে std::async
এবং std::future
ব্যবহার করে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং করা যায়।
async
এবং future
ব্যবহার#include <iostream>
#include <future>
using namespace std;
// সময়সাপেক্ষ ফাংশন
int timeConsumingTask(int x) {
this_thread::sleep_for(chrono::seconds(2)); // ২ সেকেন্ড বিরতি
return x * x;
}
int main() {
cout << "Starting async task..." << endl;
// অ্যাসিঙ্ক্রোনাসলি `timeConsumingTask` চালানো হচ্ছে
future<int> result = async(timeConsumingTask, 5);
// এই সময়ে অন্য কাজ করা যেতে পারে
cout << "Doing other tasks while waiting for async result..." << endl;
// অ্যাসিঙ্ক্রোনাস কাজের ফলাফল পাওয়া
cout << "Async task result: " << result.get() << endl;
return 0;
}
বর্ণনা:
timeConsumingTask
একটি ফাংশন, যা অ্যাসিঙ্ক্রোনাসভাবে চালানো হচ্ছে।async
ব্যবহার করে timeConsumingTask
ফাংশনটি অ্যাসিঙ্ক্রোনাসভাবে চালানো হয়েছে এবং এর রিটার্ন ভ্যালু future<int>
টাইপের result
এ সংরক্ষিত।result.get()
ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজের ফলাফল পাওয়া যায়।std::future
এবং std::promise
ব্যবহারstd::future
ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজের ফলাফল পরিচালনা করা যায় এবং std::promise
এর মাধ্যমে অ্যাসিঙ্ক্রোনাস কাজের রিটার্ন ভ্যালু সেট করা যায়।
std::promise
এবং std::future
ব্যবহার#include <iostream>
#include <thread>
#include <future>
using namespace std;
void calculateSquare(promise<int> &&p, int x) {
this_thread::sleep_for(chrono::seconds(2)); // ২ সেকেন্ড বিরতি
p.set_value(x * x); // কাজ শেষে ভ্যালু সেট করা
}
int main() {
promise<int> p;
future<int> result = p.get_future();
thread t(calculateSquare, move(p), 5);
cout << "Calculating square asynchronously..." << endl;
cout << "Square result: " << result.get() << endl; // result.get() দিয়ে ফলাফল পাওয়া যায়
t.join();
return 0;
}
বর্ণনা:
promise
এবং future
ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজের ফলাফল হ্যান্ডল করা হয়েছে।promise<int> p;
এবং future<int> result = p.get_future();
ব্যবহার করে result
এ কাজের ফলাফল পাওয়া গেছে।টুল | বিবরণ |
---|---|
thread | C++ এ থ্রেড তৈরি এবং চালানোর জন্য ব্যবহৃত হয়, যা একাধিক কাজকে কনকারেন্টলি চালাতে পারে। |
mutex | একাধিক থ্রেডের মধ্যে ডেটা সুরক্ষিত রাখার জন্য ব্যবহৃত হয়, যা ডেটা রেস সমস্যা প্রতিরোধ করে। |
async | অ্যাসিঙ্ক্রোনাস কাজের জন্য ব্যবহৃত হয়, যেখানে কাজটি এক্সিকিউট হয়ে ফলাফল ফিরে আসা পর্যন্ত অন্য কাজ চালানো যেতে পারে। |
future | অ্যাসিঙ্ক্রোনাস কাজের ফলাফল ধরার জন্য ব্যবহৃত হয়, যা কাজ শেষ হলে ফলাফল প্রদান করে। |
promise | future এর সাথে ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজের রিটার্ন ভ্যালু সেট করে। |
condition_variable | থ্রেডের মধ্যে যোগাযোগের জন্য ব্যবহৃত হয়, যেখানে থ্রেড একটি নির্দিষ্ট শর্তের জন্য অপেক্ষা করে এবং শর্ত পূরণ হলে কাজ শুরু করে। |
async
, future
, এবং promise
ব্যবহার করে করা হয়।কনকারেন্সি এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের মাধ্যমে C++ প্রোগ্রামিংয়ে কার্যকারিতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করা যায়, যা বড় প্রোগ্রামিং প্রকল্পে অত্যন্ত কার্যকর।
common.read_more